#define _GNU_SOURCE //包含这个头文件，可以使用asprintf函数
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

//在c语言为方便操作不定参数，提供了va_list、va_start、va_arg、va_end等函数。
//va_list是一种类型，用来保存不定参数的类型和地址。
//va_start函数用来初始化va_list，va_arg函数用来获取函数参数，va_end函数用来结束va_list。

//实现一个打印函数
void printNum(int n,...) //...表示不定参数  n表示参数的个数
{
    va_list ap;
    va_start(ap,n);//获取指定参数的地址，这里获取到的是n参数之后的第一个参数的起始地址
    for(int i=0;i<n;++i)
    {
        int num=va_arg(ap,int);//这里ap会自动向后偏移到下个参数的位置
        printf("param[%d]:%d\n",i,num);
    }
    va_end(ap);//将ap指针置空
}


//实现myprintf
void myprintf(const char* fmt,...)
{
    va_list ap;
    va_start(ap,fmt);//获取到fmt之后的参数的地址

    //这里调用vaspritnf
    char* res;
    int ret=vasprintf(&res,fmt,ap);
    if(ret!=-1)
    {
        printf("%s",res);
        free(res);
    }
    va_end(ap);
}
int main()
{
    printNum(2,44,77);
    myprintf("%s-%d\n","飞天猪",666);

    return 0;
}